%     FASTENER DOCTOR - программа для лечения и конвертации крепежа
%     Copyright (C) 2018-2024  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function Init_Tolerances (Model_length_unit)

% ############################################################################################################
% ##                                                                                                        ##
% ##   ВНИМАНИЕ! ИЗМЕНЕНИЕ СТАНДАРТНЫХ ЗНАЧЕНИЙ ДОПУСКОВ МОЖЕТ ПРИВЕСТИ К НЕПРАВИЛЬНОЙ РАБОТЕ ПРОГРАММЫ!    ##
% ##                                                                                                        ##
% ############################################################################################################

global ErrCode;

global MAT2_orthotropic_tolerance_multiplier; %   1
global MAT9_orthotropic_tolerance_multiplier; %   1
global MAT2_C_zero_det_tolerance; %               1
global MAT9_C_zero_det_tolerance; %               1
global Laminate_offset_round_tolerance; %         1
global Orientation_Vector_zero_tolerance; %       1
global Global_equivalence_tolerance; %            1
global Field_Zero_Record_Tolerance; %             1
global Field_Nonzero_Record_Tolerance; %          1

global Cross_Product_Vector_zero_tolerance;

global Stair_Parameter;

% Безразмерные (относительные) допуски, используемые для проверки ортотропии материалов

MAT2_orthotropic_tolerance_multiplier = 2e-6; % Относительный допуск на сумму абсолютных значений элементов матрицы Гука материала MAT2, нарушающих ортотропию
MAT9_orthotropic_tolerance_multiplier = 1e-5; % Относительный допуск на сумму абсолютных значений элементов матрицы Гука материала MAT9, нарушающих ортотропию

% Допуски, связанные с погрешностями вычислений

MAT2_C_zero_det_tolerance = 1e-6; % Допуск на равенство нулю определителя матрицы Гука материала MAT2.
MAT9_C_zero_det_tolerance = 1e-6; % Допуск на равенство нулю определителя матрицы Гука материала MAT9.
Laminate_offset_round_tolerance = 1e-14; % Допуск на ошибку округления в случае вычисления офсета ламината

% Допуски, используемые при создании полей величин

Field_Zero_Record_Tolerance = 1e-10; % Используется при сравнении величины с нулем
Field_Nonzero_Record_Tolerance = 0.0001; % Относительный допуск, используемый при сравнении ненулевых величин

% Безразмерные параметры нагружения

Stair_Parameter = 1e-5; % Параметр крутости вертикальных ступенек в модельных распределениях

% Допуски, имеющие единицу измерения длины

Orientation_Vector_zero_tolerance = 0.005; % [мм] Минимальная допускаемая длина вектора ориентации балочного элемента
Global_equivalence_tolerance = 0.005; % [мм] Допуск на равенство координат двух узлов / допуск на длину
Cross_Product_Vector_zero_tolerance = 0.005; % [мм] Допуск при сравнении с нулем векторного произведения двух единичных векторов

% Пересчет допусков, имеющих единицу измерения длины

if (~strcmp(Model_length_unit, 'mm'))

    switch Model_length_unit

        case 'm'

            k = 1000;

        case 'inch'

            k = 25.4;

        case 'ft'

            k = 304.8;

        otherwise

            fprintf (1, '\nОшибка функции Init_Tolerances: недопустимое значение переменной Model_length_unit [%s] !\n', Model_length_unit);
            ErrCode = -1;
            return;

    end
    
    Orientation_Vector_zero_tolerance = Orientation_Vector_zero_tolerance / k;
    Global_equivalence_tolerance = Global_equivalence_tolerance / k;
    Cross_Product_Vector_zero_tolerance = Cross_Product_Vector_zero_tolerance / k;

end
